home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / os20 / wb / toolmanager2_0.lha / ToolManager / Source / prefs / listreq.c < prev    next >
C/C++ Source or Header  |  1992-09-26  |  6KB  |  217 lines

  1. /*
  2.  * listreq.c  V2.0
  3.  *
  4.  * list requester handling
  5.  *
  6.  * (c) 1990-1992 Stefan Becker
  7.  */
  8.  
  9. #include "ToolManagerConf.h"
  10.  
  11. /* Window data */
  12. static struct Gadget *gl;             /* Gadget list */
  13. static struct Window *w;              /* Window */
  14. static struct MsgPort *wp;            /* Window user port */
  15. static UWORD ww,wh;                   /* Window size */
  16. static struct List *CurrentList;
  17. static struct Node *CurrentNode;
  18. static ULONG OldSeconds,OldMicros;
  19.  
  20. /* Gadget data */
  21. #define GAD_LIST   0
  22. #define GAD_OK     1
  23. #define GAD_CANCEL 2
  24. #define GADGETS    3
  25. static struct GadgetData gdata[GADGETS];
  26.  
  27. /* Gadget tags */
  28. static struct TagItem lvtags[]={GTLV_Labels,       NULL,
  29.                                 GTLV_ShowSelected, NULL,
  30.                                 TAG_DONE};
  31.  
  32. /* Init list requester */
  33. void InitListRequester(UWORD left, UWORD fheight)
  34. {
  35.  ULONG tmp,maxw1,maxw2;
  36.  struct GadgetData *gd;
  37.  
  38.  /* Init strings */
  39.  gdata[GAD_OK].name    =AppStrings[MSG_WINDOW_OK_GAD];
  40.  gdata[GAD_CANCEL].name=AppStrings[MSG_WINDOW_CANCEL_GAD];
  41.  
  42.  /* Calculate maximum width for list gadget */
  43.  maxw1=40*ScreenFont->tf_XSize;
  44.  ww=maxw1+INTERWIDTH;
  45.  
  46.  /* Calculate maximum width for button gadgets */
  47.  gd=&gdata[GAD_OK];
  48.  maxw2=TextLength(&TmpRastPort,gd->name,strlen(gd->name));
  49.  gd++;
  50.  if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > maxw2)
  51.   maxw2=tmp;
  52.  maxw2+=2*INTERWIDTH;
  53.  if ((tmp=maxw2+2*INTERWIDTH) > ww) ww=tmp;
  54.  
  55.  /* window height */
  56.  wh=11*fheight+3*INTERHEIGHT;
  57.  
  58.  /* ListView gadget */
  59.  gd=gdata;
  60.  tmp=ww-INTERWIDTH;
  61.  gd->type=LISTVIEW_KIND;
  62.  gd->tags=lvtags;
  63.  gd->left=left;
  64.  gd->top=WindowTop+INTERHEIGHT;
  65.  gd->width=tmp;
  66.  gd->height=10*fheight;
  67.  
  68.  /* OK gadget */
  69.  tmp=WindowTop+10*fheight+2*INTERHEIGHT;
  70.  gd++;
  71.  gd->type=BUTTON_KIND;
  72.  gd->flags=PLACETEXT_IN;
  73.  gd->tags=NULL;
  74.  gd->left=left;
  75.  gd->top=tmp;
  76.  gd->width=maxw2;
  77.  gd->height=fheight;
  78.  
  79.  /* Cancel Gadget */
  80.  gd++;
  81.  gd->type=BUTTON_KIND;
  82.  gd->flags=PLACETEXT_IN;
  83.  gd->tags=NULL;
  84.  gd->left=ww-maxw2-INTERWIDTH+left;
  85.  gd->top=tmp;
  86.  gd->width=maxw2;
  87.  gd->height=fheight;
  88. }
  89.  
  90. /* Open list requester */
  91. BOOL OpenListRequester(ULONG type, struct Window *oldwindow)
  92. {
  93.  char *title;
  94.  
  95.  /* Set title & list */
  96.  switch (type) {
  97.   case LISTREQ_EXEC:  title=AppStrings[MSG_LISTREQ_TITLE_EXEC];
  98.                       CurrentList=&ObjectLists[TMOBJTYPE_EXEC];
  99.                       break;
  100.   case LISTREQ_IMAGE: title=AppStrings[MSG_LISTREQ_TITLE_IMAGE];
  101.                       CurrentList=&ObjectLists[TMOBJTYPE_IMAGE];
  102.                       break;
  103.   case LISTREQ_SOUND: title=AppStrings[MSG_LISTREQ_TITLE_SOUND];
  104.                       CurrentList=&ObjectLists[TMOBJTYPE_SOUND];
  105.                       break;
  106.   case LISTREQ_PUBSC: title=AppStrings[MSG_LISTREQ_TITLE_PUBSCREEN];
  107.                       CurrentList=&PubScreenList;
  108.                       break;
  109.  }
  110.  
  111.  /* Set tags */
  112.  lvtags[0].ti_Data=CurrentList;
  113.  
  114.  /* Create gadgets */
  115.  if (gl=CreateGadgetList(gdata,GADGETS)) {
  116.   /* Open window */
  117.   if (w=OpenWindowTags(NULL,WA_Left,oldwindow->LeftEdge,
  118.                             WA_Top,oldwindow->TopEdge+WindowTop,
  119.                             WA_InnerWidth,ww,
  120.                             WA_InnerHeight,wh,
  121.                             WA_AutoAdjust,TRUE,
  122.                             WA_Title,title,
  123.                             WA_PubScreen,PublicScreen,
  124.                             WA_Flags,WFLG_CLOSEGADGET|WFLG_DRAGBAR|
  125.                                      WFLG_DEPTHGADGET|WFLG_RMBTRAP|
  126.                                      WFLG_ACTIVATE,
  127.                             TAG_DONE)) {
  128.    /* Add gadgets to window */
  129.    AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
  130.    RefreshGList(gl,w,NULL,(UWORD) -1);
  131.    GT_RefreshWindow(w,NULL);
  132.  
  133.    /* Set local variables */
  134.    w->UserPort=IDCMPPort;
  135.    w->UserData=HandleListRequesterIDCMP;
  136.    ModifyIDCMP(w,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|
  137.                  LISTVIEWIDCMP);
  138.    CurrentWindow=w;
  139.    CurrentNode=NULL;
  140.    OldSeconds=0;
  141.    OldMicros=0;
  142.  
  143.    /* All OK. (Return window UserPort signal mask) */
  144.    return(TRUE);
  145.   }
  146.  
  147.   FreeGadgets(gl);
  148.  }
  149.  /* Call failed */
  150.  return(FALSE);
  151. }
  152.  
  153. /* Close list requester */
  154. void CloseListRequester(void)
  155. {
  156.  /* Free resources */
  157.  RemoveGList(w,gl,(UWORD) -1);
  158.  CloseWindowSafely(w);
  159.  FreeGadgets(gl);
  160. }
  161.  
  162. /* Handle list requester IDCMP events */
  163. void *HandleListRequesterIDCMP(struct IntuiMessage *msg)
  164. {
  165.  struct Node *NewNode;
  166.  
  167.  /* Which IDCMP Class? */
  168.  switch (msg->Class) {
  169.   case IDCMP_CLOSEWINDOW:   NewNode=LREQRET_CANCEL;
  170.                             break;
  171.   case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
  172.                             GT_EndRefresh(w,TRUE);
  173.                             break;
  174.   case IDCMP_GADGETUP:
  175.    switch (((struct Gadget *) msg->IAddress)->GadgetID) {
  176.     case GAD_LIST:   {
  177.                       ULONG code=msg->Code;
  178.  
  179.                       /* Search node */
  180.                       CurrentNode=GetHead(CurrentList);
  181.                       while (code--) CurrentNode=GetSucc(CurrentNode);
  182.  
  183.                       /* Double-click? */
  184.                       if (DoubleClick(OldSeconds,OldMicros,
  185.                                       msg->Seconds,msg->Micros))
  186.                        /* Yes. Quit requester */
  187.                        if (CurrentNode)
  188.                         NewNode=CurrentNode;
  189.                        else
  190.                         NewNode=LREQRET_NOSELECT;
  191.  
  192.                       /* Save current time */
  193.                       OldSeconds=msg->Seconds;
  194.                       OldMicros=msg->Micros;
  195.                      }
  196.                      break;
  197.     case GAD_OK:     if (CurrentNode)
  198.                       NewNode=CurrentNode;
  199.                      else
  200.                       NewNode=LREQRET_NOSELECT;
  201.                      break;
  202.     case GAD_CANCEL: NewNode=LREQRET_CANCEL;
  203.                      break;
  204.    }
  205.    break;
  206.  }
  207.  
  208.  /* Close window? */
  209.  if (NewNode) {
  210.   /* Yes. But first reply message!!! */
  211.   GT_ReplyIMsg(msg);
  212.   CloseListRequester();
  213.  }
  214.  
  215.  return(NewNode);
  216. }
  217.